/**
 * D header file for C99.
 *
 * Copyright: Public Domain
 * License:   Public Domain
 * Authors:   Sean Kelly, Walter Bright
 * Standards: ISO/IEC 9899:1999 (E)
 */

module system.runtime.c.fenv;

extern (C):

version( Win32 )
{
	///
    struct fenv_t
    {
        ushort    status;
        ushort    control;
        ushort    round;
        ushort[2] reserved;
    }

    alias int fexcept_t;	///
}
else version( linux )
{
	///
    struct fenv_t
    {
        ushort __control_word;
        ushort __unused1;
        ushort __status_word;
        ushort __unused2;
        ushort __tags;
        ushort __unused3;
        uint   __eip;
        ushort __cs_selector;
        ushort __opcode;
        uint   __data_offset;
        ushort __data_selector;
        ushort __unused5;
    }

    alias int fexcept_t;
}
else version ( darwin )
{
    version ( BigEndian )
    {
        alias uint fenv_t;	///
        alias uint fexcept_t;	///
    }
    version ( LittleEndian )
    {
		///
        struct fenv_t
        {
            ushort  __control;
            ushort  __status;
            uint    __mxcsr;
            byte[8] __reserved;
        }

        alias ushort fexcept_t;	///
    }
}
else
{
    static assert( false );
}

enum
{
    FE_INVALID      = 1,	///
    FE_DENORMAL     = 2, 	/// non-standard
    FE_DIVBYZERO    = 4,	///
    FE_OVERFLOW     = 8,	///
    FE_UNDERFLOW    = 0x10,	///
    FE_INEXACT      = 0x20,	///
    FE_ALL_EXCEPT   = 0x3F,	///
    FE_TONEAREST    = 0,	///
    FE_UPWARD       = 0x800,///
    FE_DOWNWARD     = 0x400,///
    FE_TOWARDZERO   = 0xC00,///
}

version( Win32 )
{
    private extern fenv_t _FE_DFL_ENV;
    fenv_t* FE_DFL_ENV = &_FE_DFL_ENV;	///
}
else version( linux )
{
    fenv_t* FE_DFL_ENV = cast(fenv_t*)(-1);	///
}
else version( darwin )
{
    private extern fenv_t _FE_DFL_ENV;
    fenv_t* FE_DFL_ENV = &_FE_DFL_ENV;	///
}
else
{
    static assert( false );
}

void feraiseexcept(int excepts);	///
void feclearexcept(int excepts);	///

int fetestexcept(int excepts);		///
int feholdexcept(fenv_t* envp);		///

void fegetexceptflag(fexcept_t* flagp, int excepts);	///
void fesetexceptflag(fexcept_t* flagp, int excepts);	///

int fegetround();			///
int fesetround(int round);	///

void fegetenv(fenv_t* envp);	///
void fesetenv(fenv_t* envp);	///
void feupdateenv(fenv_t* envp);	///